/*
 * @(#)BrandBO.java $version 2011. 10. 14
 * 
 * Copyright 2011 NHN Corp. All rights Reserved.
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.hangame.mbl.bo.brand;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONException;
import net.sf.json.JSONObject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpException;

import com.hangame.mbl.constant.CommonConst;
import com.hangame.mbl.dao.brand.BrandDAO;
import com.hangame.mbl.model.Brand;
import com.hangame.mbl.util.HttpClientUtil;
import com.nhncorp.lucy.common.data.DataHandlerFactory;
import com.nhncorp.lucy.web.metadata.Inject;

// TODO: Auto-generated Javadoc
/**
 * The Class BrandBO.
 * 
 * @author Lixing
 */
public class BrandBO {
	
	/** The Constant LOG. */
	private final static Log LOG = LogFactory.getLog(BrandBO.class);
	
	/** The brand dao. */
	private BrandDAO brandDAO = null;
	
	/** The Constant MID_AUTHSMS_URL. */
	private static final String MID_AUTHSMS_URL = DataHandlerFactory.getDataHandler().get("url/mid_authsms");
	
	/** The MI d_ erro r_ map. */
	private static final Map<Integer, String> MID_ERROR_MAP;
	static {
		MID_ERROR_MAP = new HashMap<Integer, String>();
		MID_ERROR_MAP.put(400, "비밀번호를 잘못 입력하셨습니다. 다시 확인 후 입력해주세요.");
		MID_ERROR_MAP.put(404, "존재하지 않는 ID입니다.");
		//MID_ERROR_MAP.put(431, "필수 파라미터가 전달되지 않았습니다 ");
		MID_ERROR_MAP.put(431, "인증번호가 일치하지 않습니다. 인증번호를 모르겠으면 휴대폰 번호를 확인하고 다시 한번 [인증번호 전송]버튼을 눌러주세요. ");
		MID_ERROR_MAP.put(470, "이용정지된 ID로 로그인하실 수 없습니다. 상세 내용은 PC에서 한게임 접속 후 확인해주세요.");
		MID_ERROR_MAP.put(471, "해지신청중인 ID입니다. 로그인하실 수 없습니다.");
		MID_ERROR_MAP.put(472, "이용정지된 ID로 로그인하실 수 없습니다. 상세 내용은 PC에서 한게임 접속 후 확인해주세요.");
		MID_ERROR_MAP.put(473, "부모님 동의 후 이용하실 수 있습니다. 상세 내용은 PC에서 한게임 접속 후 확인해주세요.");
		MID_ERROR_MAP.put(478, "접속요청에 따라 로그인이 제한되었습니다. 상세 내용은 PC에서 한게임 접속 후 확인해주세요.");
		MID_ERROR_MAP.put(479, "해지신청중인 ID입니다. 로그인하실 수 없습니다.");
		MID_ERROR_MAP.put(483, "간편 아이디로는 본 게임에 로그인 하실 수 없습니다. 다른 아이디로 로그인 해주세요.");
		MID_ERROR_MAP.put(484, "게임 과몰입이 염려되어 한게임 이용이 일시적으로 정지되었습니다.");
		MID_ERROR_MAP.put(500, "일시적인 장애입니다. 잠시 후 다시 시도해주세요.");
		MID_ERROR_MAP.put(533, "SMS 전송에 실패하였습니다.");

		// default
		MID_ERROR_MAP.put(999, "요청처리 중 에러가 발생하였습니다. 잠시 후 다시 시도해주세요. 에러코드=");
	}
	
	/**
	 * The Class MidResult.
	 * 
	 * @author nhn
	 */
	public class MidResult {
		
		/** error string. */
		private String error = null;

		/** result JSON string. */
		private String result = null;

		/**
		 * Checks for error.
		 * 
		 * @return true, if successful
		 */
		public boolean hasError() {
			return (error != null);
		}

		/**
		 * Gets the error.
		 * 
		 * @return the error
		 */
		public String getError() {
			return error;
		}

		/**
		 * Gets the result.
		 * 
		 * @return the result
		 */
		public String getResult() {
			return result;
		}
	}
	
	/**
	 * Sets the brand dao.
	 * 
	 * @param brandDAO the new brand dao
	 */
	@Inject(beanId = "brandDAO")
	public void setBrandDAO(BrandDAO brandDAO) {
		this.brandDAO = brandDAO;
	}
	
	/**
	 * Write register.
	 * 
	 * @param gameNo the game no
	 * @param phoneNum the phone num
	 * @param sex the sex
	 * @param age the age
	 * @param osType the os type
	 * @param agency the agency
	 * @param udid the udid
	 * @param cphMdlNm the cph mdl nm
	 * @return the int
	 */
	public int writeRegister(String gameNo, String phoneNum, String sex, String age, String osType, String agency, String udid, String cphMdlNm) {
		try {
			return brandDAO.writeRegister(gameNo, phoneNum, sex, age, osType, agency, udid, cphMdlNm);
		} catch (Exception e) {
			LOG.error(e, e);
			return -1;
		}
	}
	
	/**
	 * 인정번호 발송.
	 * 
	 * @param phoneNo the phone number
	 * @return 서버에서 인증번호 확인 시 필요한 seqId를 리턴
	 * @throws HttpException the http exception
	 */
	public MidResult sendPhoneOwnerSMS(String phoneNo) throws HttpException {
		JSONObject midPost = new JSONObject();
		midPost.put("phoneNo", phoneNo.replaceAll("-", ""));
		String response[] = HttpClientUtil.getResponseBodyPost(MID_AUTHSMS_URL, midPost, "UTF-8", 1000);
		
		MidResult midRes = new MidResult();
		int statusCode = Integer.parseInt(response[0]);
		if (statusCode == 200) {
			try {
				JSONObject midObj = JSONObject.fromObject(response[1]);
				midRes.result = midObj.getString("seqId");
			} catch (JSONException e) {
				LOG.warn("JSONException occurred in searchAddress(): " + e.getLocalizedMessage());
			}
		} else {
			MID_ERROR_MAP.put(455, "전화번호가 잘못 입력되었습니다.");
			if (MID_ERROR_MAP.containsKey(statusCode)) {
				midRes.error = MID_ERROR_MAP.get(statusCode);
			} else {
				midRes.error = MID_ERROR_MAP.get(999) + statusCode;
			}
		}
		return midRes;
	}

	/**
	 * 인정번호 체킹.
	 * 
	 * @param authNum 인증번호
	 * @param seqId 서버에서 받은 seqId
	 * @return the mid result
	 * @throws HttpException the http exception
	 */
	public MidResult checkAuthNum(String authNum, String seqId) throws HttpException {
		JSONObject midPost = new JSONObject();
		midPost.put("authNum", authNum);
		midPost.put("seqId", seqId);
		String response[] = HttpClientUtil.getResponseBodyPut(MID_AUTHSMS_URL, midPost, "UTF-8", 1000);
		
		MidResult midRes = new MidResult();
		int statusCode = Integer.parseInt(response[0]);
		if (statusCode == 200) {
			/*
			try {
				JSONObject midObj = JSONObject.fromObject(response[1]);
				midRes.result = midObj.getString("seqId");
			} catch (JSONException e) {
				LOG.warn("JSONException occurred in searchAddress(): " + e.getLocalizedMessage());
			}
			*/
		} else {
			MID_ERROR_MAP.put(455, "인증번호가 일치하지 않습니다. 인증번호를 모르겠으면 휴대폰 번호를 확인하고 다시 한번 [인증번호 전송]버튼을 눌러주세요.");
			if (MID_ERROR_MAP.containsKey(statusCode)) {
				midRes.error = MID_ERROR_MAP.get(statusCode);
			} else {
				midRes.error = MID_ERROR_MAP.get(999) + statusCode;
			}
		}
		return midRes;
	}
	
	/**
	 * Checked register.
	 * 
	 * @param cphNo the cph no
	 * @return the int
	 */
	public int checkedRegister(String cphNo) {
		int count = 0;

		try {
			count = brandDAO.checkedRegister(cphNo);
		} catch (Exception e) {
			LOG.error(e, e);
			return -1;
		}
		return count;
	}
	
	/**
	 * Check alarm by cph no.
	 * 
	 * @param cphNo the cph no
	 * @return the int
	 */
	public int checkAlarmByCphNo(String cphNo) {
		int count = 0;

		try {
			count = brandDAO.selectAlarmCountByCphNo(cphNo);
		} catch (Exception e) {
			LOG.error(e, e);
			return -1;
		}
		return count;
	}
	
	/**
	 * Gets the comment phone list.
	 * 
	 * @param osType the os type
	 * @return the comment phone list
	 */
	public List<Brand> getCommentPhoneList(String osType) {
		List<Brand> osList = new ArrayList<Brand>();
		try {
			osList = brandDAO.selectCommentPhoneList(osType);
		} catch (SQLException e) {
			LOG.error(e, e);
			return osList;
		}
		return osList;
	}
	
	/**
	 * Gets the comment phone list.
	 * 
	 * @return the comment phone list
	 */
	public Map<String, List<Brand>> getCommentPhoneList() {
		Map<String, List<Brand>> mapList = new HashMap<String, List<Brand>>();
		List<Brand> androidList = new ArrayList<Brand>();
		List<Brand> iosList = new ArrayList<Brand>();
		try {
			androidList = brandDAO.selectCommentPhoneList(CommonConst.OS_TYPE_CD_ANDROID);
			iosList = brandDAO.selectCommentPhoneList(CommonConst.OS_TYPE_CD_IOS);
		} catch (SQLException e) {
			LOG.error(e, e);
			return mapList;
		}
		
		mapList.put(CommonConst.OS_TYPE_CD_ANDROID, androidList);
		mapList.put(CommonConst.OS_TYPE_CD_IOS, iosList);
		return mapList;
	}
	
	/**
	 * Write alrm info.
	 * 
	 * @param osTypeCd the os type cd
	 * @param cphMdlNm the cph mdl nm
	 * @param cphNo the cph no
	 * @param cmncCoTypeCd the cmnc co type cd
	 * @return the int
	 */
	public int writeAlrmInfo(String osTypeCd, String cphMdlNm, String cphNo, String cmncCoTypeCd) {
		int result = 0;
		try {
			result = brandDAO.insertAlarm(osTypeCd, cphMdlNm, cphNo, cmncCoTypeCd);
			return result;
		} catch (Exception e) {
			LOG.error(e, e);
			return -1;
		}
	}
}
